package CalendarioDAOS;

import CalendarioDTOS.DiaDTO;
import CalendarioDTOS.MesDTO;
import CalendarioDTOS.RegistrosDiaDTO;
import Herramientas.PasarelaDatos;
import Herramientas.ResultSets;
import SistemaDTOS.UsersDTO;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Alan Gonzalez
 */
public class CalendarioDAO {

    private PasarelaDatos db;
    private ResultSets res;

    public CalendarioDAO() {
        db = new PasarelaDatos();
        res = new ResultSets();
    }

    /**
     * Alan Gonazalez - Devuelve el numero de dias de un Mes
     *
     * @param mes
     * @param anio
     */
    public int numeroDiasMes(int mes, int anio) {
        int days = 0;
        switch (mes) {
            case 1:
                // # Enero
                Calendar calJan = new GregorianCalendar(anio, Calendar.JANUARY, 1);
                days = calJan.getActualMaximum(Calendar.DAY_OF_MONTH);
                break;
            case 2:
                // febero
                Calendar calFeb = new GregorianCalendar(anio, Calendar.FEBRUARY, 1);
                days = calFeb.getActualMaximum(Calendar.DAY_OF_MONTH);
                break;
            case 3:
                // marzo 
                Calendar calMarch = new GregorianCalendar(anio, Calendar.MARCH, 1);
                days = calMarch.getActualMaximum(Calendar.DAY_OF_MONTH);
                break;
            case 4:
                // abril
                Calendar calApril = new GregorianCalendar(anio, Calendar.APRIL, 1);
                days = calApril.getActualMaximum(Calendar.DAY_OF_MONTH);
                break;
            case 5:
                // abril
                Calendar calMay = new GregorianCalendar(anio, Calendar.MAY, 1);
                days = calMay.getActualMaximum(Calendar.DAY_OF_MONTH);
                break;
            case 6:
                Calendar calJune = new GregorianCalendar(anio, Calendar.JUNE, 1);
                days = calJune.getActualMaximum(Calendar.DAY_OF_MONTH);
                break;
            case 7:
                Calendar calJuly = new GregorianCalendar(anio, Calendar.JULY, 1);
                days = calJuly.getActualMaximum(Calendar.DAY_OF_MONTH);
                break;
            case 8:
                Calendar calAugust = new GregorianCalendar(anio, Calendar.AUGUST, 1);
                days = calAugust.getActualMaximum(Calendar.DAY_OF_MONTH);
                break;
            case 9:
                Calendar calSeptember = new GregorianCalendar(anio, Calendar.SEPTEMBER, 1);
                days = calSeptember.getActualMaximum(Calendar.DAY_OF_MONTH);
                break;
            case 10:
                Calendar calOctober = new GregorianCalendar(anio, Calendar.OCTOBER, 1);
                days = calOctober.getActualMaximum(Calendar.DAY_OF_MONTH);
                break;
            case 11:
                Calendar calNovember = new GregorianCalendar(anio, Calendar.NOVEMBER, 1);
                days = calNovember.getActualMaximum(Calendar.DAY_OF_MONTH);
                break;
            case 12:
                Calendar calDecember = new GregorianCalendar(anio, Calendar.DECEMBER, 1);
                days = calDecember.getActualMaximum(Calendar.DAY_OF_MONTH);
                break;
        }
        return days;
    }

    /**
     * METDO QUE DEVUELVE UNA POSICION DEL DIA QUE INICA UN MES
     *
     * @param mes
     * @param anio
     * @return
     */
    public int diaInicioMes(int mes, int anio) {
        int dia = 0;
        db.openDatabase();

        ResultSet rst = null;

        String query = "SELECT dayname('" + anio + "-" + mes + "-01') as dia;";
        rst = db.executeQuery(query);

        String dayname = "";

        try {
            while (rst.next()) {
                dayname = rst.getString("dia");

                if (dayname.equals("Sunday")) {
                    dia = 1; // domingo
                } else if (dayname.equals("Monday")) {
                    dia = 2; // lunes
                } else if (dayname.equals("Tuesday")) {
                    dia = 3; // martes
                } else if (dayname.equals("Wednesday")) {
                    dia = 4; // miercoles
                } else if (dayname.equals("Thursday")) {
                    dia = 5; // jueves
                } else if (dayname.equals("Friday")) {
                    dia = 6; // viernes 
                } else if (dayname.equals("Saturday")) {
                    dia = 7; // sabado
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(CalendarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return dia;
    }

    /**
     * Alan Gonzalez -- Metodo que devuelve el nombre de un mes en cadena segun
     * su numero
     *
     * @param numeroMes
     * @return
     */
    public String nombreMes(int numeroMes) {
        String nombreMes = new String();

        switch (numeroMes) {
            case 1:
                nombreMes = "Enero";
                break;
            case 2:
                nombreMes = "Febrero";
                break;
            case 3:
                nombreMes = "Marzo";
                break;
            case 4:
                nombreMes = "Abril";
                break;
            case 5:
                nombreMes = "Mayo";
                break;
            case 6:
                nombreMes = "Junio";
                break;
            case 7:
                nombreMes = "Julio";
                break;
            case 8:
                nombreMes = "Agosto";
                break;
            case 9:
                nombreMes = "Septiembre";
                break;
            case 10:
                nombreMes = "Octubre";
                break;
            case 11:
                nombreMes = "Noviembre";
                break;
            case 12:
                nombreMes = "Diciembre";
                break;
        }
        return nombreMes;
    }

    /**
     * Alan Gonazalez -- Metodo que Genera un mes
     *
     * @param mes
     * @param anio
     * @return
     */
    public MesDTO interfazMes(int mes, int anio,UsersDTO user) {
        Vector vMes = new Vector();
        MesDTO mesDTO = new MesDTO();
        int numeroDiasMes = this.numeroDiasMes(mes, anio);
        int diaInicioMes = this.diaInicioMes(mes, anio);
        int aux = 0;
        numeroDiasMes = numeroDiasMes + 1; // se recorre para no agregar un dia 0
        RegistrosDiaDAO registrosDiaDAO = new RegistrosDiaDAO();
        for (aux = 1; aux < numeroDiasMes; aux++) {
            DiaDTO dia = new DiaDTO();
            dia.setNumeroDia(aux);
            dia.setFechaDia(anio + "-" + mes + "-" + aux);
            vMes.add(dia);
        }
        mesDTO.setNombreMes(this.nombreMes(mes));
        mesDTO.setDiaInicio(diaInicioMes);
        mesDTO.setDias(vMes);
        return mesDTO;
    }

    /**
     * Alan Gonzalez -- Genera el calendario anual
     * @param anio
     * @return
     */
    public Vector calendarioAnual(int anio,UsersDTO user) {
        Vector meses = new Vector();

        int aux = 1;
        int lim = 13;// uno a desface al indice
        for (aux = 1; aux < lim; aux++) {
            MesDTO mes = new MesDTO();
            mes = this.interfazMes(aux, anio, user); // auxiliar AUX como numero del mes 
            meses.add(mes);
        }
        return meses;
    }
}
